//
//  XMHomeViewController.swift
//  XMWeibo-Swift
//
//  Created by 育鑫 王 on 15/10/27.
//  Copyright © 2015年 育鑫 王. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

// 统一管理cell的ID
enum XMStatusCellIdentifier: String {
    case NormalCell = "NormalCell"
    case ForwardCell = "ForwardCell"
}

class XMHomeViewController: XMBaseTableViewController {
    
    // MARK: - 属性
    /// 微博模型数组
    private var statuses:[XMStatus]?{
        didSet {
            tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if !XMUserAccount.userLogin(){
            return
        }
        
        setupNavigationBar()
        prepareTableView()
        
        // 默认高度是60,宽度是屏幕的宽度
        // 自定义 UIRefreshControl, 在自定义的UIRefreshControl添加自定义的view

        refreshControl = XMRefreshControl()
        // 添加下拉刷新响应事件
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        // 调用beginRefreshing开始刷新,但是不会触发 valueChanged 事件,只会让刷新控件进入刷新状态
        refreshControl?.beginRefreshing()
        
        // 代码触发 refreshControl 的 valueChanged 事件
        refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)
        
        
    }
    func loadData() {
        
        // 读取微博数据
        print("加载微博数据")
        
        // 默认下拉刷新, 获取id最大的微博, 如果没有数据, 就默认加载20
        var since_id = statuses?.first?.id ?? 0
        var max_id = 0
        
        // 如果菊花正在转, 表示 上拉更多数据
        if pullUpView.isAnimating() {
            // 上拉加载更多数据
            since_id = 0
            max_id = statuses?.last?.id ?? 0
        }
        
        XMStatus.loadStatus(since_id,max_id: max_id) { (statuses, error) -> () in
            // 关闭下拉刷新控件
            self.refreshControl?.endRefreshing()
            
            // 将菊花停止
            self.pullUpView.stopAnimating()
            
            if error != nil {
                SVProgressHUD.showErrorWithStatus("加载微博数据失败,网络不给力", maskType: SVProgressHUDMaskType.Black)
                return
            }
            
            // 下拉刷新, 显示加载了多少条微博
            if since_id > 0 {
                let count = statuses?.count ?? 0
                self.showTipView(count)
            }
            // 来到这里说明没有错误
            if statuses == nil || statuses?.count == 0 {
                SVProgressHUD.showInfoWithStatus("没有新的微博数据", maskType: SVProgressHUDMaskType.Black)
                return
            }
            
            // 判断如果是下拉刷新,拼接大批现有数据的前面
            if since_id > 0{ // 下拉刷新
                // 显示的数据 = 新数据 + 旧数据
                self.statuses = statuses! + self.statuses!
                print("下拉数据获得了\(self.statuses?.count)条数据")
            } else if max_id > 0 { // 上拉获得数据
                // 显示的数据 = 旧数据 + 新数据
                self.statuses = self.statuses! + statuses!
                print("上拉数据获得了\(self.statuses?.count)条数据")
            }else {
                // 有微博数据
                self.statuses = statuses
                print("更新完毕刷新了statuses: \(statuses)条数据")
            }
        }
    
    }
    
    /// 显示下拉刷新加载了多少条微博
    private func showTipView(count: Int) {
        let tipLabelHeight: CGFloat = 44
        let tipLabel = UILabel()
        tipLabel.frame = CGRectMake(0, -20 - tipLabelHeight, UIScreen.mainScreen().bounds.width, tipLabelHeight)
        
        tipLabel.textColor = UIColor.whiteColor()
        tipLabel.backgroundColor = UIColor.orangeColor()
        tipLabel.font = UIFont.systemFontOfSize(16)
        tipLabel.textAlignment = NSTextAlignment.Center
        
        tipLabel.text = count == 0 ? "没有新的微博" : "加载了\(count)条微博"
        
        // 添加到导航栏下面
        navigationController?.navigationBar.insertSubview(tipLabel, atIndex: 0)
        
        UIView.animateWithDuration(1, animations: { () -> Void in
            tipLabel.frame.origin.y = tipLabelHeight
            }) { (_) -> Void in
                UIView.animateWithDuration(0.75, delay: 0.3, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
                    tipLabel.frame.origin.y = -tipLabelHeight - 20
                    }, completion: { (_) -> Void in
                        tipLabel.removeFromSuperview()
                })
        }
    }
    
    
    private func prepareTableView() {
        // 添加footView,上拉加载更多数据的菊花
        tableView.tableFooterView = pullUpView
        
        // tableView注册cell
        // 原创微博cell
        tableView.registerClass(XMStatusNormalCell.self, forCellReuseIdentifier: XMStatusCellIdentifier.NormalCell.rawValue)
        // 转发微博cell
        tableView.registerClass(XMStatusForwardCell.self, forCellReuseIdentifier: XMStatusCellIdentifier.ForwardCell.rawValue)
        
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
//        // 设置预估行高
//        tableView.estimatedRowHeight = 300
//        
//        // 根据约束自己来设置高度
//        tableView.rowHeight = UITableViewAutomaticDimension
    }
    

    // 设置导航栏
    private func setupNavigationBar() {
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch")
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop")
        
        // 获取用户名
        // ??: 如果?? 前面有值,拆包 赋值给name,如果没有值 将?? 后面的内容赋值给 name
        let name = XMUserAccount.loadAccount()?.name ?? "没有名字"
        // 设置title
        let button = XMHomeTitleButton()
        
        button.setTitle(name, forState: UIControlState.Normal)
        button.setImage(UIImage(named: "navigationbar_arrow_down"), forState: UIControlState.Normal)
        button.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
        button.sizeToFit()
        
        button.addTarget(self, action: "homeButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
        
        navigationItem.titleView = button
        
    }
    
    @objc private func homeButtonClick(button: UIButton) {
        
        button.selected = !button.selected
        
        var transform: CGAffineTransform?
        if button.selected {
            transform = CGAffineTransformMakeRotation(CGFloat(M_PI - 0.01))
        }else {
            transform = CGAffineTransformIdentity
        }
        UIView.animateWithDuration(0.25) { () -> Void in
            button.imageView?.transform = transform!
        }
    }
    // MARK: - tableView 代理和数据源
    // 返回cell 的高度, 如果每次计算行高,消耗性能,将行高缓存到模型里面
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 获取模型
        let status = statuses![indexPath.row]
        
        // 取模型缓存行高
        if let rowHeight = status.rowHeight {
            // 模型有缓存的行高
            return rowHeight
        }
        // 没有缓存的行高
        
        let id = status.cellID()
        
        // 获取cell
        let cell = tableView.dequeueReusableCellWithIdentifier(id) as! XMStatusCell
        
        // 调用cell的计算行高的方法
        let rowHeight = cell.rowHeight(status)
//        print("计算: \(indexPath.row), cell高度: \(rowHeight)")
        
        // 将行高缓存起来
        status.rowHeight = rowHeight
        
        return rowHeight
    }
    
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 获取模型
        let status = statuses![indexPath.row]
        // 获取cell 
        let cell = tableView.dequeueReusableCellWithIdentifier(status.cellID()) as! XMStatusCell
        
        // 设置cell 的模型
        cell.status = status
        
        // 当最后一个cell显示的时候来加载更多微博数据
        // 如果菊花正在显示, 就表示正在加载数据, 就不加载数据
        if indexPath.row == statuses!.count - 1 && !pullUpView.isAnimating() {
            // 菊花转起来
            pullUpView.startAnimating()
            
            // 上拉加载更多数据
            loadData()
        }
        return cell
    }
    
    // MARK: - 懒加载
    // 上拉加载更多数据显示的菊花
    private lazy var pullUpView: UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        
        indicator.color = UIColor.orangeColor()
        return indicator
    }()
}
